對初學者而言Leetcode題目還蠻雜亂而且沒有系統的(要是沒有配上wisdompeak的github的話)
Leetcode說實在的不是一個很適合初學者的網站
(也許有Leetcode explore和learn會好一點)
(除了前169題)
如果寫Leetcode的過程沒有類似題目一起寫而是照題號或是某個推薦清單一題一題的寫
以高中數學來說
就像學習的過程是
老師三角函數教一題之後下一題跑去教排列組合
再下一題又教微積分,再下一題討論有理數無理數
之前才剛吸收消化的東西直接忘光
還有Leetcode每一題寫完或是想不出來
都還要自己點進去discuss慢慢看到底最優解長怎樣
而且通常大家也不會寫的很清楚他是怎麼想到這個最優解
而且常常有大神PO一些炫技解法,可讀性很差就算了常常那些解題技巧只能apply在那一題
比較幸運的話才會看到一些還不錯的類似的例題整理的心得但也很少人PO
(但以準備科技公司面試題目而言相對同類型網站
https://binarysearch.com/
https://neetcode.io/
https://www.hackerrank.com/
Leetcode已經算是裡面討論區最熱絡資源最豐富UX體驗最好的了
(AtCoder/CodeChef/Codeforce題目好像比較偏程式競賽但筆者沒有很熟)
Leetcode只有把題目分成三個難度,Easy Medium Hard
所以他的難度常常標的很不準
難度標太高
也許是強度通膨,題號前500題很多的hard其實現在看起來只是medium
就算是題號500之後的題目,也會時不時冒出跟Medium差不多難度的題目的Hard
一定比例的Medium可以用最直觀可以想到的暴力法解,也沒什麼考到什麼edge case或是DSA,其實應該要標成Easy
像是
https://leetcode.com/problems/length-of-the-longest-alphabetical-continuous-substring/
難度標太低
然而也有很多(包含題號前500)medium的題目是要在第一次看到題目10分鐘就直接想出來解法非常困難的(比不少hard都難)
(有些是蠻無跡可循的Greedy,有些是因為正解寫起來很短,可能30行內可以解決所以被標Medium)
好消息是以筆者個人經驗而言感覺這種巧妙解讚嘆解的智商題比較不太會出現在實際面試裡
就算出現了,如果沒有想到那種精妙的想法,面試官考察了你其他的思路之後也通常都會適時的給提示(讓你卡住對面試官也沒好處)
像是Leetcode近期最難medium https://leetcode.com/problems/steps-to-make-array-non-decreasing/
相同的,有些Easy同上理由,根本沒那麼Easy應該是Medium…
讀者可以實際體會看看以上兩題medium的難度差距,就知道Leetcode難度標的有多不準
因此(也因為其他競賽平台都會有標題目難度的分數)
有一個中國的大神自己寫code去爬每一次比賽結束的榜單
用一個也是類似elo公式的算法去算出每一個題目的難度分數
根據官神的說法,如果一個題目難度分是2400,代表剛好leetcode rating2400的人寫出這題的機率是50%
https://zerotrac.github.io/leetcode_problem_rating/
https://github.com/zerotrac/leetcode_problem_rating
就我個人的感覺這個題目分數還蠻準的
1800的題目就是一定會比1600的難一截
2200筆者還有機會想出來,2400+實在倍感困難
有了難度分,終於可以分出簡單的medium跟難的medium以及hard-和hard+之間的差距
hard跟medium的分界線大致上是在2000~2100之間
easy跟medium的界線大致位於1400~1500之間
也因此從接下來開始的文章筆者會盡量用題目難度分來描述leetcode的題目
另外也是很多人都推薦的刷題心法是:
寫題目的時候寫跟自己程度相仿的才會進步最快
如果目前leetcode contest分數是1600.而且每個topic都大致練習過了(像是寫完169題)
那就挑難度分1600 +-100的題目來寫
寫太難的會想太久而且背景知識落差太多所以學習效率很差
寫太簡單的也會學不到什麼東西所以學習效率很差
寫符合自己難度的題目才會剛剛好不會太難到想破頭想不出來打擊自信
也不會簡單到寫完什麼都沒學到
推薦給大家這個方法
另外針對leetcode題目,個人純主觀一些心得:
2400以上(尤其是2600以上)的題目對面試而言實在是過於困難
建議是遇到就先跳過
要知道面試官如果硬是考這些題目,
45分鐘內可能只有5%的人做得出來,
33%的人可以寫出暴力法然後通通卡在那邊(鑑別度太差他自己report也很難寫)
等你刷到超過500題 而且那500題刷得夠熟再來加深加廣自己的知識也不遲
(簡單的題目倒是再怎麼簡單都有可能考XDDD)
像是jump game 1234567 很多都是不同的主題
還有很多array相關的題目明明前一題是DP下一題推薦一個silding window的給你也是常有的事
反而真的很related的兩題:
coin change ii and combination sum IV
https://leetcode.com/problems/combination-sum-iv/discuss/111860/coin-change-and-this-problem
leetcode不一定會推薦給你,只能靠官神的Github整理
https://github.com/wisdompeak/LeetCode
所謂的很雷就是面試幾乎不可能考,或是題目描述得不清不楚,
或是寫完了也學不到什麼東西的題目
如果沒有照推薦清單寫就很有可能寫到
(但筆者沒有整理這種該跳過題目的清單XDDD)
這個大家都知道的小常識了就是leetcode跑的runtime非常不準
有些case一模一樣的code submit兩次有時候beat 90%有時候beat 10%
而且常常runtime是被worst corner case dominate
建議不要太糾結,基本上難度分1800以上的題目有AC的話複雜度都是ok的
先衝題數對面試比較有幫助
題外話,筆者找到一個很不錯的系列文
可以教大家一些"所有算法题都能用得上的超实用思想"!
来和大家聊聊我是如何刷题的(第一弹)
来和大家聊聊我是如何刷题的(第二弹)
来和大家聊聊我是如何刷题的(第三弹)